﻿Imports Aricie.DNN.Modules.LuceneSearch.Settings
Imports System.Xml.Linq
Imports System.Linq
Imports Aricie.DNN.Services.UpgradeSystem
Imports Aricie.DNN.Services.UpgradeSystem.Actions.Settings
Imports Aricie.DNN.Configuration
Imports Aricie.DNN.Modules.LuceneSearch.Business
Imports Aricie.DNN.Modules.LuceneSearch

Namespace UpgradeSystem
    Public Class UpgradeTo170ActionsProvider
        Implements IUpgradeActionsProvider(Of LuceneSearchController)

        Public Function GetActions() As UpgradeActionsCollection Implements IUpgradeActionsProvider(Of LuceneSearchController).GetActions
            Dim UpgradeTo170 = New UpgradeActionsCollection(New Version(1, 7, 0))

            UpgradeTo170.UpgradeModuleSettingsActions.Add(New UpgradeModuleSettingsAction(Of LuceneResultsSettings) With {.Name = "Modification du paramétrage, l'ensemble des propriétés liées aux templates sont maintenant dans des fichiers de ressource", .UpgradeOperation = AddressOf ChangeTemplateConfigurationLocation})

            UpgradeTo170.GlobalUpgradeActions.Add(New Aricie.DNN.Services.UpgradeSystem.Actions.GlobalUpgradeAction(Actions.ActionStep.MigrationEnded) With {.Name = "Modification de l'indexer qui dépend maintenant de DNN6 ou 7", .UpgradeOperation = AddressOf ChangeIndexerTypeInConfigFile})

            UpgradeTo170.UpgradeModuleSettingsActions.Add(New UpgradeModuleSettingsAction(Of LuceneResultsSettings) With {.Name = "Suppression du filtre sur les résultats pour les droits utilisateurs", .UpgradeOperation = AddressOf Me.RemoveFilterOnResults})

            Return UpgradeTo170
        End Function

        Private Function ChangeTemplateConfigurationLocation(TargetVersion As Version, XD As XDocument, ScopeInfo As ScopeInformation) As XDocument
            ' on va déplacer la gestion des templates vers un noeud plus profond.
            ' par ailleurs on va récupérer les valeurs par défaut qui peuvent être inscrites dans plusieurs endroits

            Try
                ' on récupère d'abord les valeurs suivantes dont on va avoir besoin
                Dim UsesLocalisation As Boolean = False
                Dim UsesTemplatedContent As Boolean = False
                Dim ResultsControlMode As ResultsControlMode = ResultsControlMode.TemplateView
                Dim ResultsControlPath As String = String.Empty
                Dim ModuleResultsTemplate As String = String.Empty
                Dim ModuleDetailsTemplate As String = String.Empty

                Boolean.TryParse((From nodes In XD.Descendants("UseLocalizedTemplates") Select nodes).Select(Function(n) n.Value).FirstOrDefault, UsesLocalisation)
                Boolean.TryParse((From nodes In XD.Descendants("UseModuleBasedTemplates") Select nodes).Select(Function(n) n.Value).FirstOrDefault, UsesTemplatedContent)
                ResultsControlMode = DirectCast([Enum].Parse(GetType(ResultsControlMode), (From nodes In XD.Descendants("ResultsControlMode") Select nodes).Select(Function(n) n.Value).FirstOrDefault), ResultsControlMode)
                ResultsControlPath = (From nodes In XD.Descendants("ResultsControlPath") Select nodes).Select(Function(n) n.Value).FirstOrDefault
                ModuleResultsTemplate = (From nodes In XD.Descendants("DefaultResultItemTemplate") Select nodes).Select(Function(n) n.Value).FirstOrDefault ' DefaultResultItemTemplate
                ModuleDetailsTemplate = (From nodes In XD.Descendants("DefaultDetailsItemTemplate") Select nodes).Select(Function(n) n.Value).FirstOrDefault ' DefaultDetailsItemTemplate

                ' on supprime les noeuds dont on vient de récupérer le contenu
                XD.Descendants("UseLocalizedTemplates").Remove()
                XD.Descendants("UseModuleBasedTemplates").Remove()
                XD.Descendants("FilterControl").Remove()
                XD.Descendants("ResultsControlPath").Remove()
                XD.Descendants("DefaultResultItemTemplate").Remove()
                XD.Descendants("DefaultDetailsItemTemplate").Remove()

                ' on en réinjecte une partie dans un noeud en dessous de la configuration actuelle
                Dim XTemplateConfiguration As New XElement("TemplateConfiguration" _
                                                            , New XElement("UseLocalizedTemplates", UsesLocalisation.ToString().ToLower()) _
                                                            , New XElement("UseModuleBasedTemplates", UsesTemplatedContent.ToString().ToLower()) _
                                                            , New XElement("FilterControl", ResultsControlMode.ToString()) _
                                                            , New XElement("ResultsControlPath", ResultsControlPath) _
                                                           )
                XD.Descendants("LuceneResultsSettings").FirstOrDefault.Add(XTemplateConfiguration)

                Dim MC As New DotNetNuke.Entities.Modules.ModuleController()
                ' on commence immédiatement par fixer la valeur qui est fournie dans les paramètres

                Dim ModuleScope As New Global.Configuration.Templating.Scope.ModuleScope(MC.GetModule(ScopeInfo.ScopeId, DotNetNuke.Common.Utilities.Null.NullInteger).PortalID, ScopeInfo.ScopeId)

                Global.Configuration.Templating.TemplateProvider.Usage.SetValue( _
                    ModuleScope _
                    , New Global.Configuration.Templating.Context.DNNTemplatingContext(IIf(ResultsControlMode = Aricie.DNN.Modules.LuceneSearch.Settings.ResultsControlMode.TemplateView, Global.Configuration.Templating.Context.TemplateTypes.Template, Global.Configuration.Templating.Context.TemplateTypes.Grid).ToString()) _
                    , ModuleResultsTemplate)

                Global.Configuration.Templating.TemplateProvider.Usage.SetValue( _
                    ModuleScope _
                    , New Global.Configuration.Templating.Context.DNNTemplatingContext(Global.Configuration.Templating.Context.TemplateTypes.Details.ToString()) _
                    , ModuleDetailsTemplate)

                Global.Configuration.Templating.TemplateProvider.Usage.CommitAll()

            Catch ex As Exception
                ' s'il y a une erreur on va la renvoyer; normalement il ne faudrait rien laisser passer à ce niveau.
                Throw
            End Try

            Return XD
        End Function

        Private Sub ChangeIndexerTypeInConfigFile(TargetVersion As Version)
            ' on va changer les valeurs présentes dans le web.config pour s'assurer que la nouvelle configuration pour l'indexer DotNetNuke est correcte
            ConfigHelper.ProcessModuleUpdate(ConfigActionType.Install, New Aricie.DNN.Modules.LuceneSearch.Configuration.LuceneSearchConfigUpdate)
        End Sub

        Private Function RemoveFilterOnResults(TargetVersion As Version, XD As XDocument, ScopeInfo As ScopeInformation) As XDocument
            'supprimons les filtres sur résultats
            Dim PermissionFilterNode = (From nodes In XD.Descendants("PermissionFilter") Select nodes).FirstOrDefault
            If PermissionFilterNode IsNot Nothing Then
                If PermissionFilterNode.Value = "FilterResults" Then
                    PermissionFilterNode.Value = PermissionFilter.FilterQuery.ToString()
                End If
            End If

            Return XD
        End Function
    End Class
End Namespace